﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using UricaoWeb.Datos.ConexionBD.Cargos;

namespace UricaoWeb.LogicaDeNegocios.Cargos
{
    public class Cargo
    {
        public int _id {get; set;} //Identificador único del cargo
        public string _nombre {get; set;} //Nombre del cargo
        public bool _activo {get; set;} //Estado del cargo: true = activo, false = inactivo
        public AccesoDatos_Cargo _acceso; //Acceso a base de datos

        #region ParametrosClase

        private readonly int _LongMinNombre = 4; //longitud minima del nombre del cargo
        private readonly int _LongMaxNombre = 50; //longitud maxima del nombre del cargo
        private readonly int _disponibilidad = 0; // disponibilidad del cargo en el sistema
        private readonly int _noInserto = -1; //No ingreso el registro en el sistema
        private readonly string _funcionRealizar = "Insertar"; //la funcion a realizar es insertar

        #endregion 

        #region Constructor

        /// <summary>
        /// El constructor de la clase por defecto
        /// </summary>
        public Cargo()
        {
            _acceso = new AccesoDatos_Cargo();
        }

   
        #endregion

        #region Metodos
        /// <summary>
        ///Metodo que devuelve el valor de _LongMinNombre
        /// </summary>
        public int getLongMinNombre()
        {
            return _LongMinNombre;
        }

        ///Metodo que devuelve el valor de _LongMinNombre
        public int getLongMaxNombre()
        {
            return _LongMaxNombre;
        }

        /// <summary>
        /// Metodo que verifica la existencia del cargo luego si este no existe, lo ingresa en 
        /// la base de dato del sistema.
        /// </summary>
        /// <param name="_nombreCargo">El nombre del cargo al cual debo verificar su existencia</param>
        /// <param name="_funcion">Si la funcion es insertar ingresa el registro en la base de datos, en caso contrario no lo ingresa</param>
        /// <returns>Retorna 0 si el cargo no existe, en caso de que la funcion sea insertar lo ingrese de una vez</returns>
        public int VerificarExistenciaCargo(string _nombreCargo, string _funcion) 
        {
            int _coincidencia = _acceso.VerificarExistenciaCargo(_nombreCargo);

            //Si el valor de_funcion es igual a _funcionRealizar realiza el metodo de ingresar el registro.
            if (_funcion.Equals(_funcionRealizar)) 
            {
                //Si el usuario no existe en la base de datos, lo ingresa automaticamente
                if (_coincidencia == _disponibilidad) 
                {
                    if (_acceso.InsertarCargo(_nombreCargo))
                    {
                        return _disponibilidad;
                    }
                    else 
                    {
                        //En caso de entrar por aqui es un error de SQLException
                        return _noInserto;
                    }
                }
            
            }
            return _coincidencia;
        }

        /// <summary>
        /// Metod  que permite consultar todos los cargos existente en el sistema.
        /// </summary>
        /// <returns>Retorna un arreglo de objetos de tipo Cargo</returns>
        public Cargo[] ConsultarCargosGeneral()
        {
            return _acceso.ConsultarCargosGeneral();
        }

        /// <summary>
        ///Metodo que realiza la consulta de todos los cargos, filtrandolos segun el estado ingresado por el usuario.
        /// </summary>
        /// <param name="_estadoCargo">Es el estado del cargo si es true=activo y si el false=inactivo</param>
        /// <returns>Retorna un arreglo de objetos de tipo Cargo</returns>
        public Cargo[] ConsultarCargosPorEstado(bool _estadoCargo)
        {
            return _acceso.ConsultarCargosPorEstado(_estadoCargo);
        }

        /// <summary>
        ///Metodo que realiza la consulta de un cargo, filtrandolo segun el nombre ingresado por el usuario.
        /// </summary>
        /// <param name="_nombreCargo">Es el nombre del cargo a consultar</param>
        /// <returns>Retorna un objeto de tipo Cargo</returns>
        public Cargo ConsultarCargoPorNombre(string _nombreCargo)
        {
            return _acceso.ConsultarCargoPorNombre(_nombreCargo);
        }

        /// <summary>
        ///Metodo que realiza la consulta de un cargo, filtrandolo segun el id ingresado por el usuario.
        /// </summary>
        /// <param name="_idCargo">Es el id del cargo a consultar</param>
        /// <returns>Retorna un objeto de tipo Cargo</returns>
        public Cargo ConsultarCargoPorId(int _idCargo)
        {
            return _acceso.ConsultarCargoPorId(_idCargo);
        }

        /// <summary>
        ///Metodo que modifica un cargo 
        /// </summary>
        /// <param name="_idCargo">Es el IdCargo seleccionado por el usuario, este parametro no se modifica</param>
        /// <param name="_nuevoNombre">Es el nuevo nombreCargo</param>
        /// <param name="_nuevoEstado">Es el nuevo estadoCargo</param>
        /// <returns>Retorna true si se logro modificar con exito en caso contrario devuelve false</returns>
        public bool ModificarCargo(int _idCargo, string _nuevoNombre, bool _nuevoEstado)
        {
            return _acceso.ModificarCargo(_idCargo, _nuevoNombre, _nuevoEstado);
        }

        #endregion
    }
}